/**
 * 
 */
package net.looker.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import net.looker.config.ConfigManager;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.mira.lucene.analysis.IK_CAnalyzer;
import org.mira.lucene.analysis.MIK_CAnalyzer;

import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;
import com.chenlb.mmseg4j.analysis.SimpleAnalyzer;


/**
 * 提取一段字符串的标签
 * 使用IK_Analyzer分词之后统计词频最高的且不是停止词的10个关键词即是
 * @author solosky
 *
 */
public class Tag
{
	/**
	 * 最大标签数
	 */
	public static int MAX_TAGS = 5;
	
	/**
	 * 停止词
	 */
	public static ArrayList<String> STOP_WORDS_LIST = new ArrayList<String>();
	
	/**
	 * 分词器
	 */
	public static  Analyzer analyzer = null;
	
	
	//初始化
	static
	{
		try {
				//初始化停止词
				String stopWordsFileName = ConfigManager.getInstance().getLookerConfig().get("data.lucene.stopWordsFile");
				File stopWordsFile = new File(stopWordsFileName);
				BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(stopWordsFile)));
				String words = null;
				while( null!=(words = reader.readLine()))
						STOP_WORDS_LIST.add(words);
				
				//初始化分词器
				String dicDir = ConfigManager.getInstance().getLookerConfig().get("data.lucene.dicDir");
				analyzer = new ComplexAnalyzer(dicDir);
				
			} catch (FileNotFoundException e) {
				throw new RuntimeException(e.getMessage());
			} catch (IOException e) {
				throw new RuntimeException(e.getMessage());
			}
	}
	
	/**
	 * 提取正文的标签
	 * 利用IK分词器将正文分次，然后统计出现次数最多的词
	 * 出现次数最多并且不是停止词的词就作为正文的标签
	 * @param content
	 * @return
	 */
	public static synchronized String exactTag(String content)
	{
		//检查参数
		if (content==null || content.length()==0)
			return null;
	
		//分析后的字词流
		TokenStream ts = analyzer.tokenStream("",new StringReader(content));
		//一个词
		Token t = null;
		//一个hash表，保存了 词=>出现次数
		HashMap <String, Integer> tokenHash = new HashMap<String, Integer>();
		
		try {
			while( (t=ts.next())!=null )
			{
				//判断是否为停止词
				if (STOP_WORDS_LIST.contains(t.term()))
					continue;
				
				//检查单个字
				if (t.term().length()<2)
					continue;
				//如果在hash表里找不到这个此条，表明此此条为新的词条，加入hash表
				if (tokenHash.get(t.term())==null)
				{
					tokenHash.put(t.term(), 1);
				}
				else
				{	//存在，增加出现次数
					Integer cnt = tokenHash.get(t.term());
					tokenHash.remove(t.term());
					tokenHash.put(t.term(), ++cnt);
				}	
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//迭代器，遍历所有的词条,找出出现次数最多的词
		Iterator<Map.Entry<String, Integer>> it = null;
		Map.Entry<String, Integer> entry = null;
		int foundCnt = 0;
		Map.Entry<String, Integer> maxEntry = null;
		StringBuffer tags = new StringBuffer();
		//遍历所有的词条
		while (foundCnt<MAX_TAGS)
		{
			 it = tokenHash.entrySet().iterator();
			while(it.hasNext())
			{
				entry = it.next();
				//System.out.println(entry.getKey()+"|"+entry.getValue());
				if (maxEntry==null)
				{
					maxEntry = entry;
					continue;
				}
				//如果当前词条数大于记录的词条出现次数，更新之
				if (entry.getValue()>maxEntry.getValue())
					maxEntry = entry;
			}
			//System.out.println(maxEntry.getKey()+"|"+maxEntry.getValue());
			//保存出现次数最多的词条为Tag
			tags.append(maxEntry.getKey());
			tags.append(' ');
			//在hash删除这个词条
			tokenHash.remove(maxEntry.getKey());
			//重置最大词条
			maxEntry = null;
			//递增计数器
			foundCnt++;
		}
		return tags.toString();
		
		//return null;
	}
	
	
	
	///test///
	public static void main(String [] argvs)
	{
		System.out.println(Tag.exactTag("据丹凤县检察院介绍，3月8日中午12时许，检察院接县公安局报称，其立案侦查的“2.10”杀人案件犯罪嫌疑人徐梗荣在审讯中出现脸色发黄、呼吸急促、脉搏微弱、流口水等情况，经送医院抢救无效死亡，请求检察机关介入，并对徐梗荣尸体进行法医检验。县检察院随机介入调查。同日，市检察院反渎职侵权局接县检察院报告后，迅即启动一体化侦查机制亦介入调查。3月9日，受商洛市检察院转丹凤县检察院委托，陕西省检察院法医白宁波、市检察院法医杨军虎在徐梗荣亲属委托代表人的见证下，对徐梗荣尸体进行了检验。此后，依照有关法律程序和规定，市、县检察机关调阅和查看了公安机关关于“2.10”杀人案件(以下简称“2.10”案件)的相关案卷、材料，询问了相关办案人员。重点对公安机关在办理“2.10”案件、特别是审讯嫌疑人徐梗荣的执法过程和行为进行了调查。经过近一段时间的调查，并结合法医检验的鉴定结论，初步查明：丹凤县公安局“2.10”专案指挥部及专案组在审讯嫌疑人徐梗荣过程中存在严重的违法行为。个别指挥人员和少数民警存在刑讯逼供行为，有的已经涉嫌犯罪。经查，2月28日晚11时，该县公安局“2.10”专案组传唤了有重大杀人嫌疑的丹凤县中学高三(10)班学生徐梗荣到公安机关接受询问。次日，徐对杀害“2.10”受害人彭丽娜的过程、动机作了供述。3月1日，“2.10”专案指挥部决定对徐梗荣刑事拘留，并组织警力展开进一步审讯。自3月1日起至3月8日凌晨6时许，办案人员先后在县公安局刑警队、资峪派出所对嫌疑人徐梗荣进行了长时间、不间断的疲劳审讯，少数民警在审讯中对徐梗荣还实施了肉体侵害行为，致使徐梗荣身体极度疲劳引发心跳骤停，经抢救无效死亡。丹凤县检察院表示： 针对丹凤县公安局“2.10”专案指挥部及少数民警的违法行为和责任，依照有关法律规定，现已分别对丹凤县公安局局长、“2.10”专案指挥部总指挥阎耀峰，以涉嫌滥用职权罪立案侦查，鉴于其有投案自首情节，对其采取取保候审的强制措施；对丹凤县公安局主管刑侦工作的纪委书记、“2.10”专案指挥部副总指挥王庆保，以涉嫌玩忽职守罪立案侦查，刑事拘留；对丹凤县公安局刑警大队大队长、“2.10”专案指挥部成员孙鹏，以涉嫌玩忽职守罪立案侦查，刑事拘留；对丹凤县公安局刑警大队教导员、“2.10”专案组审讯负责人赵朔，以涉嫌行刑逼供罪立案侦查，刑事拘留；对丹凤县公安局刑警大队四中队队长、“2.10”专案组审讯人员贾严刚，以涉嫌行刑逼供罪立案侦查，刑事拘留；对商洛市公安局刑警支队民警、“2.10”专案组审讯人员李红卫，以涉嫌行刑逼供罪立案侦查，刑事拘留；对丹凤县公安局刑警大队四中队民警、“2.10”专案组审讯人员王卫，以涉嫌行刑逼供罪立案侦查，刑事拘留。目前，案件仍在进一步侦查之中，相关人员所涉及的罪名及事实尚须进一步调查和取证。(完)"));
	}
}
